/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.com.pangalacteos.util;

import br.com.pangalacteos.dao.HibernateDAO;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.persistence.Persistence;

/**
 *
 * @author Leandro Del Sole
 */
public class Validator {
     // 02998301000181
     // ##.###.###/####-##
     // 02.998.301/0001-81
     // 012345678901234567
     public static void CNPJ( String cnpj ) throws Exception {  
        System.out.println("CNPJ " + cnpj);
        if ( cnpj.length() != 18 ){
            throw new Exception("CNPJ inválido");
        }
        
        //parseia o cnpj tirando a mascara
        StringBuilder sb = new StringBuilder();
        sb.append(cnpj.substring(0, 2));
        sb.append(cnpj.substring(3, 6));
        sb.append(cnpj.substring(7, 10));
        sb.append(cnpj.substring(11, 15));
        sb.append(cnpj.substring(16));
        
        cnpj = sb.toString();
        System.out.println("CNPJ parseado: " + cnpj);
        
        int soma = 0, aux, dig;  
        String cnpj_calc = cnpj.substring(0,12);    
   
        char[] chr_cnpj = cnpj.toCharArray();  
   
        /* Primeira parte */  
        for( int i = 0; i < 4; i++ )  
          if ( chr_cnpj[i]-48 >=0 && chr_cnpj[i]-48 <=9 )  
            soma += (chr_cnpj[i] - 48 ) * (6 - (i + 1)) ;  
        for( int i = 0; i < 8; i++ )  
          if ( chr_cnpj[i+4]-48 >=0 && chr_cnpj[i+4]-48 <=9 )  
            soma += (chr_cnpj[i+4] - 48 ) * (10 - (i + 1)) ;  
        dig = 11 - (soma % 11);  
   
        cnpj_calc += ( dig == 10 || dig == 11 ) ?  
                       "0" : Integer.toString(dig);  
   
        /* Segunda parte */  
        soma = 0;  
        for ( int i = 0; i < 5; i++ )  
          if ( chr_cnpj[i]-48 >=0 && chr_cnpj[i]-48 <=9 )  
            soma += (chr_cnpj[i] - 48 ) * (7 - (i + 1)) ;  
        for ( int i = 0; i < 8; i++ )  
          if ( chr_cnpj[i+5]-48 >=0 && chr_cnpj[i+5]-48 <=9 )  
            soma += (chr_cnpj[i+5] - 48 ) * (10 - (i + 1)) ;  
        dig = 11 - (soma % 11);  
        cnpj_calc += ( dig == 10 || dig == 11 ) ?  
                       "0" : Integer.toString(dig);  
   
        if (!cnpj.equals(cnpj_calc)){
            throw new Exception("CNPJ inválido");
        }
     }
     
     public static void campoTamanhoFixo(String conteudo, String nome, int tamanho)
             throws Exception {
        if (conteudo == null || conteudo.isEmpty() || conteudo.length() != tamanho){
            throw new Exception(nome + " inválido");
        }
     }
     
     public static void campoPreenchido(String conteudo, String nome) throws Exception {
        if (conteudo == null || conteudo.isEmpty()) throw new Exception(nome + " inválido");
     }
     
     public static void dataFutura(String dataFutura, String nome) throws Exception {
        try {
            Calendar dataFuturaC = Calendar.getInstance();
            dataFuturaC.setTime(
                    new SimpleDateFormat("dd/MM/yyyy").parse(dataFutura));
            // gambiarra, evito que os minutos influenciem
            dataFuturaC.set(Calendar.HOUR_OF_DAY, 23);
            dataFuturaC.set(Calendar.MINUTE, 59);
            dataFuturaC.set(Calendar.SECOND, 59);
            dataFuturaC.set(Calendar.MILLISECOND, 999);
            //fim da gambiarra
            Calendar atual = Calendar.getInstance();
            System.out.println("Data atual: " + atual);
            System.out.println("Data futura: " + dataFuturaC);
            if (dataFuturaC.before(atual)) throw new Exception(nome + " inválido");
        } catch (Exception e){
            throw new Exception(nome + " inválido");
        }
     }
     
     public static void data(String data, String nome) throws Exception {
        try {
            new SimpleDateFormat("dd/MM/yyyy").parse(data);
        } catch (Exception e){
            throw new Exception(nome + " inválido");
        }
     }
     
     public static void dataEmBranco(String data, String nome) throws Exception {
        try {
            if (data == null || data.isEmpty() || data.replace("/", "").trim().isEmpty()) return;
            data(data, nome);
        } catch (Exception e){
            throw new Exception(nome + " inválido");
        }
     }
     
     public static void dataMinima(String data, String dataMinima, String nome) throws Exception {
        try {
            Calendar dataMaiorC = Calendar.getInstance();
            dataMaiorC.setTime(
                    new SimpleDateFormat("dd/MM/yyyy").parse(data));
            // gambiarra, evito que os minutos influenciem
            dataMaiorC.set(Calendar.HOUR_OF_DAY, 23);
            dataMaiorC.set(Calendar.MINUTE, 59);
            dataMaiorC.set(Calendar.SECOND, 59);
            dataMaiorC.set(Calendar.MILLISECOND, 999);
            //fim da gambiarra
            Calendar dataMenorC = Calendar.getInstance();
            dataMenorC.setTime(
                    new SimpleDateFormat("dd/MM/yyyy").parse(dataMinima));
            System.out.println("Data menor: " + dataMenorC);
            System.out.println("Data maior: " + dataMaiorC);
            if (dataMaiorC.before(dataMenorC)) throw new Exception(nome + " inválido");
        } catch (Exception e) {
            throw new Exception(nome + " inválido");
        }
     }
     
     public static void dataMinimaEmBranco(String data, String dataMinima, String nome) throws Exception {
        try {
            if (data == null || data.isEmpty() || data.replace("/", "").trim().isEmpty()) return;
            dataMinima(data, dataMinima, nome);
        } catch (Exception e) {
            throw new Exception(nome + " inválido");
        }
     }
     
     public static void existeId(Class clazz, Object id, String nome) throws Exception {
        if (id == null) throw new Exception(nome + " inválido");
        if (!new HibernateDAO().contains(clazz, id)) throw new Exception(nome + " inválido");
     }
     
     public static void existeIdEmBranco(Class clazz, Object id, String nome) throws Exception {
        if (id == null) return;
        if (!new HibernateDAO().contains(clazz, id)) throw new Exception(nome + " inválido");
     }
     
     public static void monetarioEmBranco(String valor, String nome) throws Exception {
        try{
            //se o valor estiver vazio ou nulo, não deixa o campo lançar exceção
            if (valor == null || valor.isEmpty()) return;
            Parser.parseFloat(valor);
        } catch (Exception e){
            throw new Exception(nome + " inválido");
        }
     }
     
     public static void monetario(String valor, String nome) throws Exception {
        campoPreenchido(valor, nome);
        monetarioEmBranco(valor, nome);
     }
}
